# -*- coding: utf-8 -*-
"""
一键式整合了其他三个工具， 即 导入Obj->根据Obj顶点渲染贴图->切分模型->减面处理，完成操作后导出到Fbx。
用法：
    blender your_file.blend  --background --python optimize_3d_obj.py  -- -output_dir /tmp/out/ -input_model xxx.obj -angle_limit 1 -merge_distance 0.0001 -split_times 3
注意：
    如果导入的模型是fbx，请注意输出目录不能和输入的目录是同一个目录，避免导出的fbx覆盖原始的fbx
    angle_limit 采用角度
    merge_distance 不能太大

特别说明：
    incremental_planar_decimate_and_merge 按角度递进式塌陷处理以提高处理速度，对于非常平坦的模型，不建议使用
            不但不会增加速度，还会降低速度
        angle_steps 采用动态调整步长的方式处理的，调整步长的数值，可以根据实际情况修改 curvature_std 及 angle_steps 起始值
"""

import os,sys
from datetime import datetime
import bpy

# 获取当前文件的绝对路径，并返回上级目录 
parent_dir = os.path.abspath(os.path.join(os.path.dirname(__file__),  '..'))
sys.path.insert(0,  parent_dir)  # 将上级目录添加到搜索路径首部 
sys.path.insert(0, os.path.abspath(os.path.dirname(__file__)))

from common_func import export_model, parse_cli_args, delete_default_objs
from convert_3d_obj_to_use_texture import bake_vertex_color_to_texture
from split_model_to_parts import split_model
from decimate_model import planar_decimate_and_merge, incremental_planar_decimate_and_merge

if __name__ == "__main__":
    args = parse_cli_args()
    out_dir = args.get("output_dir", os.getcwd())
    input_obj = args.get("input_obj") 
    split_times = args.get("split_times", 3)
    angle_limit = args.get("angle_limit", 1)
    merge_dist = args.get("merge_distance", 0.0001)
    if not input_obj:
        print(f"您需要输入一个3D OBJ模型文件用于转换，输入参数： {args}")
        sys.exit(0)

    os.makedirs(out_dir,  exist_ok=True)

    delete_default_objs()

    with bpy.context.temp_override( 
            selected_objects=bpy.context.scene.objects[:],    #先清空旧选区保险起见 
            active_object=None):
        for ob in list(bpy.data.objects): 
            ob.select_set(False) 

    with bpy.context.temp_override(filepath=str(input_obj)): 
        bpy.ops.wm.obj_import(filepath=str(input_obj)) 

        # 调整模型的几何中心
        bpy.ops.object.origin_set(type='ORIGIN_GEOMETRY',  center='BOUNDS')

        obj = bpy.context.selected_objects[0]
        bake_vertex_color_to_texture(obj, out_dir)

        split_model(obj, int(split_times))

        need_decimate_objs = bpy.context.selected_objects
        print("need_decimate_objs:", need_decimate_objs)

        start_t = datetime.now()
        for o in need_decimate_objs:
            planar_decimate_and_merge(o, float(angle_limit), float(merge_dist))
            # incremental_planar_decimate_and_merge(o, float(angle_limit), float(merge_dist))
        print(f"Decimate done, took: {(datetime.now()-start_t).seconds} s")
        
        # ---------- 导出FBX ----------
        model_path = os.path.join(out_dir,  f"{obj.name}.fbx") 
        export_model(model_path)
        
        print(f"已输出到 {out_dir}")